[NET/BLK] back: Change the netback and blkback device drivers to allow
authorkaf24@localhost.localdomain <kaf24@localhost.localdomain>
Sat, 19 Aug 2006 09:20:08 +0000 (10:20 +0100)
committerkaf24@localhost.localdomain <kaf24@localhost.localdomain>
Sat, 19 Aug 2006 09:20:08 +0000 (10:20 +0100)
and handle frontend state transition from "Closing" to "Initialising".
Instead of destroying the backend device then they wait for a
reconnect from the frontend.  Needed for domU kexec support, to hand over
devices from one kernel instance to the next.

Signed-off-by: Gerd Hoffmann <kraxel@suse.de>
linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c
linux-2.6-xen-sparse/drivers/xen/netback/xenbus.c

index ca01d155953b0c885151693d78b96ecb19f5c594..0f268c9e33ad2fa2866e6403ad6fd48ccdc60c0c 100644 (file)
@@ -305,6 +305,11 @@ static void frontend_changed(struct xenbus_device *dev,
 
        switch (frontend_state) {
        case XenbusStateInitialising:
+               if (dev->state == XenbusStateClosing) {
+                       printk("%s: %s: prepare for reconnect\n",
+                              __FUNCTION__, dev->nodename);
+                       xenbus_switch_state(dev, XenbusStateInitWait);
+               }
                break;
 
        case XenbusStateInitialised:
index 6bb87a636ed873faa06dc39f84a59ae3851cfc5e..a0e396123423a31a93f02e098ff78e0e63a23e62 100644 (file)
@@ -234,10 +234,25 @@ static void frontend_changed(struct xenbus_device *dev,
 
        switch (frontend_state) {
        case XenbusStateInitialising:
+               if (dev->state == XenbusStateClosing) {
+                       printk("%s: %s: prepare for reconnect\n",
+                              __FUNCTION__, dev->nodename);
+                       if (be->netif) {
+                               netif_disconnect(be->netif);
+                               be->netif = NULL;
+                       }
+                       xenbus_switch_state(dev, XenbusStateInitWait);
+               }
+               break;
+
        case XenbusStateInitialised:
                break;
 
        case XenbusStateConnected:
+               if (!be->netif) {
+                       /* reconnect: setup be->netif */
+                       backend_changed(&be->backend_watch, NULL, 0);
+               }
                maybe_connect(be);
                break;